package org.jiuling.xml.read;

import org.jiuling.local.tools.verify.ObjectVerify;
import org.jiuling.xml.exception.XMLRuntimeException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文档对象模型
 * @author 紫灵
 * @date 2024年01月27日 16时24分16秒
 */
public class DocumentObjectModel {

    /**
     * 读取节点
     * @param nodeList 节点列表
     * @return 节点Map列表
     */
    private List<Map<String,String>> readNode(NodeList nodeList){
        List<Map<String,String>> elementMapList = new ArrayList<>();
        // 遍历节点列表
        for (int i = 0; i <nodeList.getLength() ; i++) {
            elementMapList.add(
                    // 封装节点数据
                    packageNodeData(
                            // 获取子节点列表
                            nodeList.item(i).getChildNodes()
                    )
            );
        }
        return elementMapList;
    }

    /**
     * 封装节点数据
     * @param nodeList 节点列表
     * @return 节点数据Map
     */
    private Map<String,String> packageNodeData(NodeList nodeList){
        Map<String,String> childNodeMap = new HashMap<>();
        // 遍历子节点
        for (int j = 0; j <nodeList.getLength() ; j++) {
            // 判断节点是否为元素节点
            if (nodeList.item(j).getNodeType()== Node.ELEMENT_NODE) {
                Node node =  nodeList.item(j);
                // 获取节点名称
                String nodeName =node.getNodeName();
                //获取节点值
                Node firstChild = node.getFirstChild();
                String nodeValue = ObjectVerify.isNull(firstChild)? null:firstChild.getNodeValue();
                childNodeMap.put(nodeName,nodeValue);
            }
        }
        return childNodeMap;
    }

    public List<Map<String,String>> readText(String xmlStr,String elementName){
        // 创建DocumentBuilderFactory对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            return readNode(
                    // 创建DocumentBuilder对象
                    factory.newDocumentBuilder()
                            // 解析文本
                            .parse(new InputSource(new StringReader(xmlStr)))
                            // 获取节点
                            .getElementsByTagName(elementName)
            );
        } catch (ParserConfigurationException | IOException | SAXException e) {
            throw new XMLRuntimeException(e);
        }
    }

}
